package cn.me.implement.threadpool.v1_0;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * <h3>线程池 1.0 版本</h3>
 * 它实现的功能如下：
 * <ul>
 *     <li>线程在线程池初始化时就创建了</li>
 *     <li>使用一个 {@link java.util.List} 存放所有线程</li>
 *     <li>{@link #submit(Runnable task)} 通过任务队列提交任务，线程通过任务队列领取任务</li>
 *     <li>任务队列使用 {@link java.util.concurrent.ArrayBlockingQueue} 阻塞队列实现</li>
 * </ul>
 */
public class ThreadPool1_0 {

    /**
     * 存放线程的集合，大小为 5
     */
    private final List<Thread> threadPool = new ArrayList<>(5);

    /**
     * 任务队列，大小为 10
     */
    private final BlockingQueue<Runnable> taskQueue = new ArrayBlockingQueue<>(10);

    /**
     * 线程池中的线程执行的任务，永不结束
     */
    private final Runnable taskRunInThread = () -> {
        while (true) {
            Runnable t = null;
            try {
                // 取出任务，这步操作是阻塞的，如果线程没有取到任务，则会一直阻塞在这里
                t = taskQueue.take();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            t.run();
        }
    };

    // 初始化时直接创建所有线程
    public ThreadPool1_0() {
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(taskRunInThread);
            threadPool.add(thread);
            thread.start();
        }
    }

    /**
     * 提交任务
     *
     * @param task 待执行的任务
     */
    public void submit(Runnable task) {
        taskQueue.offer(task);
    }
}
